#ifndef _STRING_H_
#define _STRING_H_
/*
  其实vc编译器本身包含了这些函数定义，我们完全可以把string.h内的函数定义
  都注释掉，然后为每个.c文件编译时加上/Ox编译选项即可。
*/

#ifndef NULL
#define NULL 0
#endif

#ifndef _SIZE_T
#define _SIZE_T
typedef unsigned int size_t;			// 大小相关的类型
#endif

// 有这个声明，但未看到在哪里有具体定义或者使用
extern char * strerror(int errno);

/*
* 这个字符串头文件以内嵌函数的形式定义了所有字符串操作函数。使用gcc 时，同时
* 假定了ds=es=数据空间，这应该是常规的。绝大多数字符串函数都是经手工进行大量
* 优化的，尤其是函数strtok、strstr、str[c]spn。它们应该能正常工作，但却不是那
* 么容易理解。所有的操作基本上都是使用寄存器集来完成的，这使得函数即快有整洁。
* 所有地方都使用了字符串指令，这又使得代码“稍微”难以理解?
 *
 *		(C) 1991 Linus Torvalds
 */
 
//// 将一个字符串(src)拷贝到另一个字符串(dest)，直到遇到NULL 字符后停止。
// 参数：dest - 目的字符串指针，src - 源字符串指针。
// %0 - esi(src)，%1 - edi(dest)。
char * strcpy(char * dest,const char *src);
// 字符串拼接，未见到使用
char * strcat(char * dest,const char * src);
// 字符串拼接，未见到使用
int strcmp(const char * cs,const char * ct);
int strspn(const char * cs, const char * ct);
int strcspn(const char * cs, const char * ct);
char * strpbrk(const char * cs,const char * ct);
char * strstr(const char * cs,const char * ct);
int strlen(const char * s);
extern char * ___strtok;
char * strncpy(char * dest,const char *src,int count);
char * strchr(const char * s,char c);

char * strtok(char * s,const char * ct);

/*
 * Changes by falcon<zhangjinw@gmail.com>, the original return value is static
 *  ... it can not be called by other functions in another files.
 */

void * memcpy(void * dest,const void * src, int n);
void * memmove(void * dest,const void * src, int n);
void * memchr(const void * cs,char c,int count);
void * memset(void * s,char c,int count);
#endif
